package com.zz.inventory.task;

import com.ruoyi.common.core.utils.DateUtils;
import com.zz.inventory.domain.Clients;
import com.zz.inventory.service.IClientsService;
import com.zz.inventory.service.ILabsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;

@Component
public class ClientHeartbeatTask {

    @Autowired
    private IClientsService clientsService;

    @Autowired
    private ILabsService labsService;

    // cron 设为每 2 分钟执行，
    // 阈值设为 DateUtils.addHours(new Date(), -3)（3 小时前）
    // 表示 “每 2 分钟扫描一次，清理‘3 小时未心跳’的客户端”。
    @Scheduled(cron = "0 */5 * * * ?")
    public void scanOfflineClients() {
        // 1. 计算超时阈值：当前时间 - 1小时
        Date threshold = DateUtils.addMinutes(new Date(), -5);

        // 2. 查询：心跳时间 < 阈值 的客户端（状态可能是 online）
        List<Clients> timeoutClients = clientsService.selectClientsByHeartbeat(threshold);

        // 3. 更新状态为离线
        for (Clients client : timeoutClients) {
            client.setStatus("offline"); // 或数据库枚举值，如 "offline"
            clientsService.updateClients(client);
            // 同步更新机房状态
            labsService.updateLabStatusByClient(client.getClientId(), "offline");
        }

        System.out.println("需要离线的客户端数量：" + timeoutClients.size());
    }

    // 每5分钟执行一次（与离线检查错开1分钟）
    @Scheduled(cron = "1 */5 * * * ?")
    public void scanOnlineClients() {
        // 1. 计算“在线阈值”：当前时间 - 允许的最大心跳间隔（如 1 小时）
        Date onlineThreshold = DateUtils.addMinutes(new Date(), -5);

        // 2. 查询：心跳时间 >= 阈值 且 状态为 offline 的客户端
        List<Clients> onlineClients = clientsService.selectClientsByOnline(onlineThreshold);

        // 3. 更新状态为 online
        for (Clients client : onlineClients) {
            client.setLastHeartbeat(new Date());
            client.setStatus("online"); // 心跳上报即在线
            clientsService.updateClients(client);
            // 同步更新机房状态
            labsService.updateLabStatusByClient(client.getClientId(), "online");
        }

        System.out.println("恢复在线客户端数量：" + onlineClients.size());
    }
    // 每天凌晨检查维护状态
    @Scheduled(cron = "0 0 0 * * ?")
    public void checkMaintenanceStatus() {
        // 检查无心跳记录的客户端（从未上报过心跳）
        List<Clients> noHeartbeatClients = clientsService.selectClientsWithNoHeartbeat();
        for (Clients client : noHeartbeatClients) {
            if (!"maintenance".equals(client.getStatus())) {
                client.setStatus("maintenance");
                clientsService.updateClients(client);
                // 同步更新机房状态
                labsService.updateLabStatusByClient(client.getClientId(), "maintenance");
            }
        }
    }
}